﻿using System;
using System.Web.Services;
using DCS.Domain;
using DCS.Domain.Entities;

namespace DCS.Service.Interfaces
{
    ///<summary>
    /// Методы, предназначенные для работы административного клиента.
    ///</summary>и    
    public interface IAdminClientMethods
    {
        /// <summary>
        /// Создаёт сессию для работы с административным клментом.
        /// </summary>
        /// <returns> Идентификатор сессии. </returns>
        [WebMethod]
        Guid StartAdminSession();

        /// <summary>
        /// Останавливает сессию администратора.
        /// </summary>
        /// <param name="sessionId"> Идентификатор сессии. </param>
        [WebMethod]
        void StoptAdminSession(Guid sessionId);

        /// <summary>
        /// Добавляет вычислительную задачу на сервис.
        /// </summary>
        /// <param name="task"></param>
        /// <returns></returns>
        [WebMethod]
        string AddTask(TaskPack task);

        /// <summary>
        /// Возвращает результат вычисления.
        /// </summary>
        /// <param name="taskId"> Идентификатор задания. </param>
        /// <returns> Объект TaskResultStruct. </returns>
        [WebMethod]
        TaskResult GetResult(Guid taskId);

        /// <summary>
        /// Получает описание заданий, имеющихся на сервисе.
        /// </summary>
        /// <param name="adminId"> Идентификатор администратора, запрашивающего задание. </param>
        /// <param name="waitForUpdate"> Если флаг установлен - ожидается получение обновлённых данных. </param>
        /// <returns> Массив состояний задач. </returns>
        [WebMethod]
        TaskInfo[] GetAllTaskStates(Guid adminId, bool waitForUpdate);

        ///<summary>
        ///</summary>
        ///<param name="adminId"></param>
        ///<returns></returns>
        TaskInfo[] GetAllTaskInfos(Guid adminId);

        /// <summary>
        /// Возвращает статистику работы сервиса.
        /// </summary>
        /// <returns> Подробная статистика работы сервиса. </returns>
        [WebMethod]
        ServiceWorkStatistics GetStatistics();

        /// <summary>
        /// Получает текущее состояние сервиса.
        /// </summary>
        /// <returns> Текущее состояние сервиса. </returns>
        [WebMethod]
        ServiceState GetCurrentState();

        /// <summary>
        /// Возвращает сводные данные по клиентам системы.
        /// </summary>
        /// <returns></returns>
        HardwareDescription GetSummaryCharacteristics();

        /// <summary>
        /// Возвращает число активных клиентов.
        /// </summary>
        /// <param name="time"></param>
        /// <returns></returns>
        int GetActiveClientsNumber(DateTime time);

        /// <summary>
        /// Перезапускает сервис. При этом база данных полностью очищается.
        /// </summary>        
        [WebMethod]
        int RestartService();

        ///<summary>
        /// Возвращает адрес центрального сервера системы DCS.
        ///</summary>
        ///<returns>Адрес сервера.</returns>
        [WebMethod]
        string GetCentralServerAddress();
        
        ///<summary>
        /// Устанавливает адрес центрального сервера системы DCS.
        ///</summary>
        ///<param name="address">Адрес сервера.</param>
        [WebMethod]
        void SetCentralServerAddress(string address);
    }
}
